package com.company.exp2.typeEnum;

/**
 * @author dyy
 * 这里定义了所有时间线上会出现的事件类型
 * 只需要注意每一个 Event 的具体时间即可
 * 还有工厂类的实例生成
 */
public enum EventType {
    /**
     * -------------------------------------
     * 这个事件没有实现类，只是写着玩的^^
     * （绝对写完注释后发现不需要实现又懒得删掉）
     * -------------------------------------
     *
     * 模型启动事件
     * 模型启动事件是在模型启动时就被声明到信道之中，
     * 他的时间点必须为 0
     * 它会进行模型启动所必需的操作
     * 例如：
     *  声明所有站点的 CREATE_FRAME 事件
     *  声明所有站点的最初的 CHANNEL_TRANSMITTABLE 事件
     */
    MODEL_START,

    /**
     *  帧产生事件
     *  这个事件将会自循环的产生，直到达到次数上限
     *  每个站点都应该有一个自己的帧产生事件
     */
    CREATE_FRAME,

    /**
     *  帧传输超时事件
     *  这个时间的触发只能是因为出现了碰撞
     *  此时应当调用相关站点的 onFrameTransmissionFailed 方法
     */
    FRAME_TIMEOUT,

    /**
     * 信道可传输帧事件
     * 该事件将会调用 context 的 onChannelTransmittable 方法
     *
     * 这个事件的触发意味着所有站点的冻结了的回退倒计时应当复苏
     * 此时开始有站点竞争发送帧
     *
     * 为了简化模型，在这个事件开始时才resign标记在context上的
     * 上一个传输的帧
     */
    CHANNEL_TRANSMITTABLE,

    /**
     * 信道禁止传输事件
     * 当有一个站点成功开始传输帧时，就应当声明这个事件
     * 这个事件应该做一件额外的事情：
     *   当检测到context的正在传输的帧的源站和自身相关站点序号一致，
     *   则调用该帧的onTransmitting方法
     *   详情可见【Frame :: onAttemptToTransmit】
     *
     * 注意，声明这个事件并不意味着传输的帧就安全了
     * 如果有相同时间点一起传输的帧，则会发生碰撞
     * 这个声明时间会避免下一个时间点之后的碰撞
     *
     * 注意，forbidden事件需要设置相关站点，以便检测碰撞
     * 详情可见【Frame :: onAttemptToTransmit】
     *
     * 这个事件将会在 Frame 的 onAttemptToTransmit 中声明
     */
    CHANNEL_FORBIDDEN,

    /**
     * 帧传输事件
     * 这个事件的发生意味着相关站点应当开始传输帧
     *
     * 这个事件是由 站点 的 avoid 方法，即回避方法声明
     * 回避方法的冻结和解冻机制会保证帧传输事件的声明时间点一定是信道的空闲时间
     * 但是并不能保证其他站点会不会与自己一起发送帧
     * 因此仍然会发生碰撞
     */
    FRAME_START_TRANSMIT,

    /**
     * 帧完成传输事件
     * 调用帧的 onTransmissionFinished 方法
     *
     * 这个时间将会在帧【成功传输】时声明
     * 这个事件主要是让传输成功的帧的源站进行一些传输成功的操作
     */
    FRAME_END_TRANSMIT
}
